﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SoftwareConsulting.Interfaces.BasicEntities;
using SoftwareConsulting.BI11.Studio.BasicEntities;
using SoftwareConsulting.BI11.Studio.Core.DBProviders;
using SoftwareConsulting.BI11.Studio.Core.Users.Properties;

[assembly:CLSCompliant(true)]
namespace SoftwareConsulting.BI11.Studio.Core.Users
{
    public interface IUserInfo:IUnique
    {
        /// <summary>
        /// Возвращает целиком Ф.И.О. пользователя
        /// </summary>
        string LFP { get; }
        /// <summary>
        /// Возвращает/устанавливает логин пользователя
        /// </summary>
        string LogOn { get; set; }
        /// <summary>
        /// Возвращает/устанавливает пароль пользователя
        /// </summary>
        string Password { get; set; }
        /// <summary>
        /// Возвращает/устанавливает фамилию пользователя
        /// </summary>
        string LastName { get; set; }
        /// <summary>
        /// Возвращает/устанавливает имя пользователя
        /// </summary>
        string FirstName { get; set; }
        /// <summary>
        /// Возвращает/устанавливает отчество пользователя
        /// </summary>
        string Patronymic { get; set; }
        /// <summary>
        /// Возвращает/устанавливает дату рождения пользователя
        /// </summary>
        DateTime BirthDate { get; set; }
        /// <summary>
        /// Возвращает/устанавливает название должности пользователя
        /// </summary>
        string Post { get; set; }
        /// <summary>
        /// Возвращает/устанавливает группу, который принадлежит пользователь
        /// </summary>
        Teams Team { get; set; }
        /// <summary>
        /// Привязывается к существующему пользователю по его строке в генеральной таблице
        /// </summary>
        /// <param name="generalTableRow"></param>
        void Bind(INamedList generalTableRow);
        /// <summary>
        /// Привязывается к существующему пользователю
        /// </summary>
        /// <param name="existingUserId"></param>
        void Bind(Guid existingUserId);
        /// <summary>
        /// Добавляет нового пользователя и привязывается к нему
        /// </summary>
        void CreateAndBind(string newLogOn, string newPassword, string newLastName, string newFirstName, string newPatronymic, DateTime newBirthDate, string newPost, Teams newTeam);
    }

    /// <summary>
    /// Класс информации о пользователе
    /// </summary>
    public sealed class UserInfo: Unique, IUserInfo
    {
        private SystemDBProvider _DB;//для доступа к БД системы
        private string _LogOn;
        private string _password;
        private string _lastName;
        private string _firstName;        
        private string _patronymic;
        private DateTime _birthDate;
        private string _post; //должность
        private Teams _team; //группа пользователей        

        /// <summary>
        /// Возвращает целиком Ф.И.О. пользователя
        /// </summary>
        public string LFP
        {
            get
            {
                return _lastName + " " + _firstName + " " + _patronymic;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает логин пользователя
        /// </summary>
        public string LogOn
        {
            get
            {
                return _LogOn;
            }
            set
            {
                _LogOn = value;
                //записываем в БД
                INamedList fvals = new NamedList();
                fvals.AddValue(SystemDBProvider.IdField, Id);
                INamedList nvals = new NamedList();
                nvals.AddValue(SystemDBProvider.LogOnField, value);
                _DB.GeneralChangeRowValues(SystemTable.Users, fvals, nvals, false);                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает пароль пользователя
        /// </summary>
        public string Password
        {
            get
            {
                return _password;
            }
            set
            {
                _password = value;
                //записываем в БД
                INamedList fvals = new NamedList();
                fvals.AddValue(SystemDBProvider.IdField, Id);
                INamedList nvals = new NamedList();
                nvals.AddValue(SystemDBProvider.PasswordField, value);
                _DB.GeneralChangeRowValues(SystemTable.Users, fvals, nvals, false);                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает фамилию пользователя
        /// </summary>
        public string LastName
        {
            get
            {
                return _lastName;
            }
            set
            {
                _lastName = value;
                //записываем в БД
                INamedList fvals = new NamedList();
                fvals.AddValue(SystemDBProvider.IdField, Id);
                INamedList nvals = new NamedList();
                nvals.AddValue(SystemDBProvider.LastNameField, value);
                _DB.GeneralChangeRowValues(SystemTable.Users, fvals, nvals, false);                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает имя пользователя
        /// </summary>
        public string FirstName
        {
            get
            {
                return _firstName;
            }
            set
            {
                _firstName = value;
                //записываем в БД
                INamedList fvals = new NamedList();
                fvals.AddValue(SystemDBProvider.IdField, Id);
                INamedList nvals = new NamedList();
                nvals.AddValue(SystemDBProvider.FirstNameField, value);
                _DB.GeneralChangeRowValues(SystemTable.Users, fvals, nvals, false);                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает отчество пользователя
        /// </summary>
        public string Patronymic
        {
            get
            {
                return _patronymic;
            }
            set
            {
                _patronymic = value;
                //записываем в БД
                INamedList fvals = new NamedList();
                fvals.AddValue(SystemDBProvider.IdField, Id);
                INamedList nvals = new NamedList();
                nvals.AddValue(SystemDBProvider.PatronymicField, value);
                _DB.GeneralChangeRowValues(SystemTable.Users, fvals, nvals, false);                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает дату рождения пользователя
        /// </summary>
        public DateTime BirthDate
        {
            get
            {
                return _birthDate;
            }
            set
            {
                _birthDate = value;
                //записываем в БД
                INamedList fvals = new NamedList();
                fvals.AddValue(SystemDBProvider.IdField, Id);
                INamedList nvals = new NamedList();
                nvals.AddValue(SystemDBProvider.BirthdateField, value);
                _DB.GeneralChangeRowValues(SystemTable.Users, fvals, nvals, false);                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает название должности пользователя
        /// </summary>
        public string Post
        {
            get
            {
                return _post;
            }
            set
            {
                _post = value;
                //записываем в БД
                INamedList fvals = new NamedList();
                fvals.AddValue(SystemDBProvider.IdField, Id);
                INamedList nvals = new NamedList();
                nvals.AddValue(SystemDBProvider.PostField, value);
                _DB.GeneralChangeRowValues(SystemTable.Users, fvals, nvals, false);                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает группу, который принадлежит пользователь
        /// </summary>
        public Teams Team
        {
            get
            {
                return _team;
            }
            set
            {
                _team = value;
                //записываем в БД
                INamedList fvals = new NamedList();
                fvals.AddValue(SystemDBProvider.IdField, Id);
                INamedList nvals = new NamedList();
                nvals.AddValue(SystemDBProvider.TeamField, value);
                _DB.GeneralChangeRowValues(SystemTable.Users, fvals, nvals, false);                
            }
        }

        /// <summary>
        /// Привязывается к существующему пользователю по его строке в генеральной таблице
        /// </summary>
        /// <param name="generalTableRow"></param>
        public void Bind(INamedList generalTableRow)
        {
            SetId((Guid)generalTableRow.GetValue(SystemDBProvider.IdField));
            _LogOn = generalTableRow.GetValue(SystemDBProvider.LogOnField) as string;
            _password = generalTableRow.GetValue(SystemDBProvider.PasswordField) as string;
            _lastName = generalTableRow.GetValue(SystemDBProvider.LastNameField) as string;
            _firstName = generalTableRow.GetValue(SystemDBProvider.FirstNameField) as string;
            _patronymic = generalTableRow.GetValue(SystemDBProvider.PatronymicField) as string;
            _birthDate = (DateTime)generalTableRow.GetValue(SystemDBProvider.BirthdateField);
            _post = generalTableRow.GetValue(SystemDBProvider.PostField) as string;
            _team = (Teams)generalTableRow.GetValue(SystemDBProvider.TeamField);
        }

        /// <summary>
        /// Привязывается к существующему пользователю
        /// </summary>
        /// <param name="existingUserId"></param>
        public void Bind(Guid existingUserId)
        {            
            INamedList fvals = new NamedList();
            fvals.AddValue(SystemDBProvider.IdField, existingUserId);
            INamedList hvals = _DB.GeneralGetFirstRowValuesByKnownFields(PredefinedTable.Users, fvals);
            Bind(hvals);
        }

        /// <summary>
        /// Добавляет нового пользователя и привязывается к нему
        /// </summary>
        public void CreateAndBind(string newLogOn, string newPassword, string newLastName, string newFirstName, string newPatronymic, DateTime newBirthDate, string newPost, Teams newTeam)
        {
            INamedList nvals = new NamedList();
            nvals.AddValue(SystemDBProvider.IdField, Id);
            nvals.AddValue(SystemDBProvider.LogOnField, newLogOn);
            nvals.AddValue(SystemDBProvider.PasswordField, newPassword);
            nvals.AddValue(SystemDBProvider.LastNameField, newLastName);
            nvals.AddValue(SystemDBProvider.FirstNameField, newFirstName);
            nvals.AddValue(SystemDBProvider.PatronymicField, newPatronymic);
            nvals.AddValue(SystemDBProvider.BirthdateField, newBirthDate);
            nvals.AddValue(SystemDBProvider.PostField, newPost);
            nvals.AddValue(SystemDBProvider.TeamField, (int)newTeam); 
            _DB.GeneralAddRow(SystemTable.Users, nvals);
            Bind(nvals);
        }

        public UserInfo(SystemDBProvider systemDB):
            base()
        {
            _DB = systemDB;
        }
    }
}
